package edu.mbb.basepackage;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.Enumeration;
import java.util.Map;

import edu.mbb.annocation.Controller;
import edu.mbb.annocation.Dao;
import edu.mbb.annocation.Service;
import edu.mbb.ioc.ClassNames;
import edu.mbb.springmybatis.SqlSessionFactoryBean;

public class GetPaceOverClass {

	public static void getAllPackOverClass(Map<String, Object> ioc, String packageName) {
		// List<Class<?>> list=new ArrayList<Class<?>>();
		// 1. 首先判断 包的写法 并且 对包 进行 修改 修改为 类的加载器能够加载的模式：
		// 类的加载器 加载 为 反斜杠的形式
		// packageName = packageName.replace(".", System.lineSeparator());

		// 2.创建 类的加载器 对 资源 进行加载 并且 启动 加载
		ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
		// packageName=packageName.replace(System.lineSeparator(),".");
		try {
			// 3 获取到 此包下所有的资源
			Enumeration<URL> resources = contextClassLoader.getResources(packageName);
			while (resources.hasMoreElements()) {

				// 4.获取到 当前资源
				URL nextElement = resources.nextElement();
				// 获取 此 url 的类型 在网络传输中代表 协议名称
				// String type = nextElement.getProtocol();
				// 获取当前路劲名字
				String file = nextElement.getFile();
				File typeFile = new File(file);
				if (typeFile.isDirectory()) {
					// 此时代表 还是个文件 不是 对应的 jar文件
					// 递归调用 自己下一层
					File[] listFiles = typeFile.listFiles();
					for (File file2 : listFiles) {
						getAllPackOverClass(ioc, packageName + "/" + file2.getName());
					}
				}
				// 判断是否 是文件 并且 以 .class 结尾
				else if (typeFile.getName().endsWith(".class")) {
					// 读到对应类文件了 开始解析是否有注解
					try {
						System.out.println(packageName);

						String temp = packageName.replace("/", ".");
						System.out.println(temp);
						Class<?> clzz = Class.forName(temp.substring(0, packageName.lastIndexOf(".")));
						if (clzz.isInterface()) {
							if (clzz.isAnnotationPresent(Dao.class)) {

							}
						}
						isAnnotation(ioc, clzz);
					} catch (ClassNotFoundException e) {
						e.printStackTrace();
					}
				}
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		// return list;
	}

	private static void isAnnotation(Map<String, Object> ioc, Class<?> clzz) {
		ClassNames.addClass(clzz);
		// 得到需要注入到ioc容器中的类
		if (clzz.isAnnotationPresent(Dao.class)) {
			// 对mydao接口特殊处理 生成他的代理类
			Object SqlSessionFactoryBean = ioc.get("SqlSessionFactoryBean");
			if (SqlSessionFactoryBean == null) {
				Object newInstance = null;
				try {
					newInstance = edu.mbb.springmybatis.SqlSessionFactoryBean.class.newInstance();
				} catch (InstantiationException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IllegalAccessException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				ioc.put("SqlSessionFactoryBean", newInstance);
			}
			SqlSessionFactoryBean sqlsession = (edu.mbb.springmybatis.SqlSessionFactoryBean) ioc
					.get("SqlSessionFactoryBean");
			Object myDaoAnnotionProxy = sqlsession.getMyDaoAnnotionProxy(clzz);
			ioc.put(clzz.getSimpleName(), myDaoAnnotionProxy);
		}
		if (clzz.isAnnotationPresent(Controller.class) || clzz.isAnnotationPresent(Service.class)) {
			try {
				ioc.put(clzz.getSimpleName(), clzz.newInstance());
			} catch (InstantiationException e) {
				// TODO Auto-generated catch block
				System.out.println("bean注入失败");
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		// 存在了 进行 注解的操作

	}

}
